package com.rbac.admin.service.system;

import com.baomidou.mybatisplus.extension.service.IService;
import com.rbac.admin.dto.MenuDTO;
import com.rbac.admin.entity.system.SystemMenu;

import java.util.List;

/**
 * 菜单服务接口
 *
 * @author rbac-admin
 * @since 2024-07-18
 */
public interface MenuService extends IService<SystemMenu> {

    /**
     * 根据用户ID查询菜单列表
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SystemMenu> getMenusByUserId(String userId);

    /**
     * 根据角色ID查询菜单列表
     *
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<SystemMenu> getMenusByRoleId(String roleId);
    
    /**
     * 根据角色ID查询菜单ID列表
     *
     * @param roleId 角色ID
     * @return 菜单ID列表
     */
    List<String> getMenuIdsByRoleId(String roleId);

    /**
     * 根据用户ID查询权限列表
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    List<String> getPermissionsByUserId(String userId);

    /**
     * 根据用户ID和角色ID查询菜单列表（角色切换专用）
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<SystemMenu> getMenusByUserIdAndRoleId(String userId, String roleId);

    /**
     * 根据用户ID和角色ID查询菜单DTO列表（角色切换专用）
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 菜单DTO列表
     */
    List<MenuDTO> getMenuDTOsByUserIdAndRoleId(String userId, String roleId);

    /**
     * 根据用户ID和角色ID查询权限列表（角色切换专用）
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 权限列表
     */
    List<String> getPermissionsByUserIdAndRoleId(String userId, String roleId);

    /**
     * 构建菜单树
     *
     * @param menus 菜单列表
     * @return 菜单树
     */
    List<SystemMenu> buildMenuTree(List<SystemMenu> menus);
    
    /**
     * 根据用户ID查询菜单DTO列表（转换后的树形结构）
     *
     * @param userId 用户ID
     * @return 菜单DTO列表
     */
    List<MenuDTO> getMenuDTOsByUserId(String userId);
    
    /**
     * 根据角色ID查询菜单DTO列表（转换后的树形结构）
     *
     * @param roleId 角色ID
     * @return 菜单DTO列表
     */
    List<MenuDTO> getMenuDTOsByRoleId(String roleId);
    
    /**
     * 获取所有菜单DTO列表（转换后的树形结构）
     *
     * @param name 菜单名称 (可选)
     * @param type 菜单类型 (可选)
     * @param status 菜单状态 (可选)
     * @param parentId 父级菜单ID (可选)
     * @return 菜单DTO列表
     */
    List<MenuDTO> getAllMenuDTOs(String name, Integer type, Integer status, String parentId);

    /**
     * 获取所有菜单DTO列表（转换后的树形结构），不带条件
     *
     * @return 菜单DTO列表
     */
    default List<MenuDTO> getAllMenuDTOs() {
        return getAllMenuDTOs(null, null, null, null);
    }
} 